/*
1、const_cast 的原因： 常量转换为非常量。添加或者移除const 或 volatile 性质
原因是，我们可能调用了一个参数不是const的函数，而我们要传进去的实际参数确实const的，但是我们知道这个函数是不会对参数做修改的。
于是我们就需要使用const_cast去除const限定，以便函数能够接受这个实际参数。 
应该遵从这样的原则：使用const_cast去除const限定的目的绝对不是为了修改它的内容，只是出于无奈


2、static_cast
2.1编译器隐式执行的任何类型转化都可以； 
2.2当一个较大的算术类型赋值给一个较小类型；
2.3可以将void* 转化为某一类型指针； 
2.4 可以将基类指针指向派生类；
2.5 无法将const 转换为none-const.

3、reinterpret_cast
允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。

4、dynamic_cast
dynamic_cast 主要用于执行“安全的向下转型（safe downcasting）”，也就是说，要确定一个对象是否是一个继承体系中的一个特定类型。
转换可能会不成功，如果不成功返回NULL.

*/

// 示例：
// 在银行系统中，假设存在两种账号：支票账号和现金帐号，他们都有存款操作，但是这两种操作是不同的。
// 假设他们都继承自账号类，如下：


#include<iostream>
class CAccount
{
    virtual void Saveing();
};
class CPaperAccount : public CAccount
{
    public:
    virtual void Saveing();
};
class CCashAccount : public CAccount
{
    public:
    virtual void Saveing();
};
//系统要在运行时动态的判断是哪种账号，然后调用相应的Saveing()函数,该如何处理呢？

void Save(CAccount* pAcc)
{
    CPaperAccount *p1 = dynamic_cast<CPaperAccount*>(pAcc);
    if(p1)
    {
        p1->Saveing();
    }
    CCashAccount *p2 = dynamic_cast<CCashAccount*>(pAcc);
    if(p2)
    {
        p2->Saveing();
    }
}
void main()
{
    CCashAccount *pCashAcc = new CCashAccount();
    Save(pCashAcc);
}
//在save函数中不可以使用static_cast


